package com.common.sdk.net.download.util;

import java.io.File;

import android.content.Context;

import com.android.sohu.sdk.common.toolbox.FileUtils;
import com.android.sohu.sdk.common.toolbox.NetworkUtils;
import com.android.sohu.sdk.common.toolbox.StorageUtils;

/**
 * SD卡文件操作，需要写成线程安全类
 * @author wenlonglv
 *
 */
public class DownloadFilePathUtils {
    private static Context mContext;
    private static File mRootDirectory = null;

    private static final String DEFAULT_DOWNLOAD_FILE = "DOWNLOAD_FILE";

    private static final long MB = 1024L * 1024L;
    private static final long MB_100 = 100L * 1024L;
    private static final long GB = 1024L * MB;

    /**空间不足40%*/
    private static final long UNSPACE = 40;

    public static Context getContext() {
        return mContext;
    }

    /**
     * 得到SD卡的路径
     * @return
     */
    public static File getRootCacheDir() {
        return mRootDirectory;
    }

    /**
     * 得到文件的下载路径
     * @return
     */
    public static File getDownloadFile() {
        synchronized (DownloadFilePathUtils.class) {
            return getCacheDir(DEFAULT_DOWNLOAD_FILE);
        }
    }

    // public static String getDownloadFileExt() {
    // return DOWNLOAD_FILE_EXT;
    // }

    /**
     * 空间是否小于100M
     * @return
     */
    public static boolean isSpaceSmall() {
        // synchronized (DownloadFilePathUtils.class) {
        long availableSpace = StorageUtils.getAvailableSpace();
        if (availableSpace < MB_100) {
            return false;
        }
        return true;
        // }
    }

    /**
     * 空间是否不足40% && 剩余空间小于1G
     * @return
     */
    public static boolean isHasSpace() {
        // synchronized (DownloadFilePathUtils.class) {
        long allspace = StorageUtils.getAllSpace();
        long availableSpace = StorageUtils.getAvailableSpace();
        long p = (availableSpace * 100) / allspace;
        if (availableSpace < GB && p < UNSPACE) {
            return false;
        }
        return true;
        // }
    }

    /**
     * 在SD卡中创建文件
     * @return
     */
    private static File getCacheDir(String path) {
        if (mRootDirectory == null) {
            initiateDirectory(mContext);
            // return null;
        }
        File file = new File(mRootDirectory, path);
        if (file != null) {
            if (!file.exists()) {
                file.mkdirs();
            }
        }
        return file;
    }

    /**
     * 是否有SD卡
     * @return
     */
    public static void initiateDirectory(Context context) {
        mContext = context;
        mRootDirectory = getAppSdcardCacheDir(context);
        if (mRootDirectory == null) {
            DownloadLog.debug("sd card may not exists");
            return;
        }
        if (!mRootDirectory.exists()) {
            mRootDirectory.mkdirs();
        }
    }

    /**
     * SD卡下班是否有文件,一个文件路径一个锁，非相同文件之间不需要
     * @return
     */
    public static boolean isHasSDFile(File filePath) {
        synchronized (filePath) {
            if (filePath != null) {
                if (filePath.exists()) {
                    return true;
                }
            }
            return false;
        }
    }

    public static boolean deleteFile(File filePath) {
        synchronized (filePath) {
            if (filePath != null) {
                if (filePath.exists()) {
                    return filePath.delete();
                }
            }
            return false;
        }
    }

    /**
     * 得到SD的路径
     * @return
     */
    private static File getAppSdcardCacheDir(Context context) {
        try {
            if(context == null){
                return null;
            }
            File appCacheDir = context.getExternalFilesDir(null);
            if (appCacheDir == null) {
                return null;
            }
            DownloadLog.debug("externalFileDirs  is : " + appCacheDir.getAbsolutePath());
            if (!appCacheDir.exists()) {
                if (!appCacheDir.mkdirs()) {
                    DownloadLog.debug("Unable to create external cache directory");
                    return null;
                }
            }
            return appCacheDir;
        } catch (Exception e) {
            DownloadLog.e(e);
            return null;
        }
    }

    /**
     * 是否有网络
     * @return
     */
    public static boolean isOnline() {
        return NetworkUtils.isOnline(mContext);
    }

    /**
     * 用下载文件路径或者文件名计算hash码  TODO  获取文件的hash码有问题，只是获取了文件路径的前半部分
     * @param downloadPath 下载文件路径或者文件名
     * @return 返回文件的hash码，用作文件的唯一标识
     */
    private static String getFilenameForKey(String downloadPath) {
        return FileUtils.getFilenameForKey(downloadPath);
    }

    /**
     * 用下载文件路径或者文件名计算hash码，带后缀的文件路径
     * @param key 下载文件路径或者文件名
     * @return 返回文件的hash码及路径
     */
    // public static File getDownloadFilePath(String downloadPath) {
    // synchronized (downloadPath) {
    // File fileDir = getDownloadFile();
    // if (fileDir == null) {
    // return null;
    // }
    // return new File(fileDir, getFilenameForKey(downloadPath) +
    // DOWNLOAD_FILE_EXT);
    // }
    // }
    /**
     * 用下载文件路径或者文件名计算hash码，带后缀的文件路径
     * @param key 下载文件路径或者文件名
     * @return 返回文件的hash码及路径
     */
    public static File getDownloadFilePath(String downloadPath, String suffixName) {
        synchronized (downloadPath) {
            File fileDir = getDownloadFile();
            if (fileDir == null) {
                return null;
            }
            return new File(fileDir, getFilenameForKey(downloadPath) + suffixName);
        }
    }
}
